package com.seehack.sample.thread.concurrent;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 *  CyclicBarrier使用：
 *  1.声明栅栏对象实例
 *  2.在线程需要等待的地方调用await
 *  3.当所有线程都执行到await才能往后执行
 *
 */
public class CyclicBarrierSample {

    public static void main(String[] args) {
        int parties = 5;
        CyclicBarrier cyclicBarrier = new CyclicBarrier(parties,()->{
            // 所有线程都执行到await执行该方法
            System.out.println("CyclicBarrier: all await() end.");
        });
        for (int i = 0; i < parties; i++) {
            final int index = i;
            new Thread(()->{
                System.out.println("index: ["+index+"] ready.");
                try {
                    // 等待其他await方法全部执行
                    // 设置await超时,且执行次数小于parties会出现BrokenBarrierException
                    // 未设置await超时，且执行次数小于parties会线程卡死
                    cyclicBarrier.await();
                } catch (InterruptedException | BrokenBarrierException e) {
                    e.printStackTrace();
                }
                System.out.println("index: ["+index+"] end.");
            }).start();
        }
    }
}
